<?
class Classement extends TriggerFunction{
	var $Increment;
	function __construct($Options,$Action,$Script){
		TriggerFunction::__construct($Options,$Action,$Script);
		$this->FileName = $this->Name;
		$this->Increment = $Options["Increment"];
		$this->Link = $Options["Link"];
	}
	function Exe($Input) {
		$Ident = $Input->Id;
		$Add = 1;
		//ON gere le cas ou la reponse est un script
		if ($this->Script!=""){
			$Process = new Process();
			$Process->TempVar["INPUT"] = $Input;
			$Process->ProcessVars($this->Script);
			$Add = $Process->TempVar["OUTPUT"];
		}
		if ($this->Link!=""){
			$Process = new Process();
			$Process->TempVar["INPUT"] = $Input;
			$Link = $Process->ProcessingVars($this->Link);
		}
		//On gere les options
		foreach ($this->Conf as $N=>$V){
			//GROUPEMENT POUR EVITER LES DOUBLONS
			if ($N=="GroupBy") $Ident = $Input->Get($V);
			//IDENTIFIANT DE LA LIGNE
			if ($N=="Identifier") $Ident = $Input->Get($V);
			//INCREMENTATION PAR EVNEMENT
			if ($N=="Increment") $Increment = $V;
			//INCREMENTATION PAR EVNEMENT
			if ($N=="Add") $Add = $V;
		}
		if (trim($Ident)=="") return false;
		foreach ($this->Action->Period as $P){
			//Gestion du fichier
			$File = $this->CreatePath($Input,date($P),$this->FileName); 
			$F=@fopen($File,"r");
			$PointPos = 0;
			$Value = 0;
			//On parcourt le fichier a la recherche de Ident
			while(!feof($F) && $LineArray[0] != $Ident){
				$PointPos = ftell($F);
				$Line = fgets($F);
				$LineArray = explode("|",$Line);
			}
		
			//On reouvre le fichier pour ecrire
			$T=@fopen($File.".tmp","w");
			//Si l'identifiant est deja dans le fichier
			//On ajoute les deux valeurs
			$NewValue = (feof($F))?$Add:$LineArray[1] + $Add;
			//La ligne a ecrire
			if ($Increment){
				if ($this->Link!=""){
					//On incremente 
					$Inc = (feof($F))?$Increment:$LineArray[2] + $Increment;
					$ToPut = "$Ident|$NewValue|$Inc|$Link\n";
				}else{
					//On incremente 
					$Inc = (feof($F))?$Increment:$LineArray[2] + $Increment;
					$ToPut = "$Ident|$NewValue|$Inc\n";
				}
			}else{
				 $ToPut = "$Ident|$NewValue\n";
			}
			$Val=-1;
			fseek($F,0);
			$maj=0;
			//On se positionne sur le nouvel emplacement dans le fichier
			while(!feof($F)) {
				//on sauvegarde la ligne
				$Line = fgets($F);
				$LineArray = explode("|",$Line);
				$Val = $LineArray[1];
				//On ecrit dans le fichier temporaire
				if  ($Val<$NewValue&&!$maj){
					$maj=1;
					fputs($T,$ToPut);
				}
				if ($Ident!=$LineArray[0]){
					fputs($T,$Line);
				}
			}
			if (!$maj) fputs($T,$ToPut);
			fclose($T);
			fclose($F);
			//On supprime le fichier original
			unlink($File);
			//On renomme le fichier temporaire 
			rename($File.".tmp",$File);
		}
	}
	function getDatas($Folders) {
		$Result = Array();
		if (is_array($Folders)) foreach ($Folders as $Fo){
			$File= $Fo["Url"]."/".$this->FileName.".rec";
			$F = @fopen($File,"r");
			if ($F)while (!feof($F)) {
				$buffer = fgets($F, 4096);
				if ($buffer!=""){
					$buffer = explode("|",trim($buffer));
					//On recherche un id equivalent
					$t=0;
					$n = sizeof($Result);
					for ($i=0;$i<$n&&!$t;$i++) if ($Result[$i]["Id"]==$buffer[0]){
						//Alors on ajoute à la sortie existante
						$Result[$i]["Value"] += $buffer[1];
						if ($this->Increment)$Result[$i]["Total"]+=$buffer[2];
						$t=1;
					}
					if (!$t){
						$Temp["Id"] = $buffer[0];
						$Temp["Value"] = $buffer[1];
						if ($this->Increment)$Temp["Total"] = $buffer[2];
						if ($this->Link)$Temp["Link"] = $buffer[3];
						$Result[] = $Temp;
					}
				}
			}
		}
		//On range maintenant les résultats par valeurs descendantes
		$Result = Trigger::bubbleSort($Result , "Value","DESC");
		return $Result;
	}
}
?>